const db = uniCloud.database();

// 查询表product_wallpaper_list中select为true的数据重置为false
function resetWallpaperSelect() {
	db.collection('product_wallpaper_list')
		.where({
			select: true
		})
		.update({
			select: false
		});
}

// 查询 product_wallpaper_class 表中所有分类，
// 在 product_wallpaper_list 表中随机选择每种分类的一条数据，
// 设置这些选中的数据的字段 select 为 true
async function randomWallpaperSelect() {
	const classCollection = db.collection('product_wallpaper_class');
	const listCollection = db.collection('product_wallpaper_list');
	// 1. 获取所有分类名称
	const { data: classlist } = await classCollection.get();
	if (!classlist || classlist.length === 0) {
		return;
	}
	for (const classItem of classlist) {
		// 2. 在 product_wallpaper_list 中查找属于该分类的数据数量
		const { total } = await listCollection
			.where({
				class_id: classItem._id
			})
			.count();
		if (total === 0) continue;
		// 3. 随机取一个偏移量
		const randomSkip = Math.floor(Math.random() * total);
		// 4. 获取该分类下的一条随机记录
		const {
			data: [randomItem]
		} = await listCollection
			.where({
				class_id: classItem._id
			})
			.skip(randomSkip)
			.limit(1)
			.get();
		if (randomItem) {
			// 5. 设置 select 为 true
			await listCollection.doc(randomItem._id).update({
				select: true
			});
		}
	}
}

// 过滤用户评分表(product_wallpaper_score)中has_statistic=false的评分记录，按图片id(wallpaper_id)分组，
// 每组在图片表(product_wallpaper_list)中根据图片id查找对应记录，
// 遍历每组评分user_score，分别减去product_wallpaper_score.score，差值求和，然后除以组记录数，得到用户评分值，
// 更新product_wallpaper_score.score=用户评分值+当前图片的系统评分score
// product_wallpaper_score.wallpaper_id外键关联product_wallpaper_list._id
async function computedSystemScore() {
	const scoreCollection = db.collection('product_wallpaper_score');
	const listCollection = db.collection('product_wallpaper_list');

	// 使用聚合查询按 wallpaper_id 分组并计算每个分组的 diffSum 和记录数
	const $ = db.command.aggregate;
	const aggregateResult = await scoreCollection
		.aggregate()
		.match({
			has_statistic: false
		})
		.lookup({
			from: 'product_wallpaper_list',
			localField: 'wallpaper_id',
			foreignField: '_id',
			as: 'wallpaper'
		})
		.unwind('$wallpaper')
		.group({
			_id: '$wallpaper_id',
			diffSum: $.sum($.subtract(['$user_score', '$wallpaper.score'])),
			count: $.sum(1),
			systemScore: $.first('$wallpaper.score')
		})
		.end();

	// 批量更新图片表
	const updatePromises = [];
	for (const item of aggregateResult.data) {
		const userScore = parseFloat((item.diffSum / item.count).toFixed(1));
		const newScore = userScore + item.systemScore;
		// 确保 score 在 0.5 到 5 的范围内
		const finalScore = Math.min(Math.max(newScore, 0.5), 5);
		// 准备图片表的更新操作
		const updatePromise = listCollection.doc(item._id).update({
			score: finalScore
		});
		updatePromises.push(updatePromise);
	}

	// 并发执行更新操作
	await Promise.all(updatePromises);

	// 直接更新评分表中 has_statistic 为 false 的记录
	await scoreCollection.where({ has_statistic: false }).update({ has_statistic: true });
}

module.exports = {
	resetWallpaperSelect,
	randomWallpaperSelect,
	computedSystemScore
};
